<?php

namespace app\common\library;

class AesEncrypt
{
    /**
     * AES加密
     * @param string $data 待加密数据，json数据
     * @param string $key 加密密钥，秘钥长度32
     * @param string $method 加密方式，默认为AES-256-CBC
     * @param string $iv 初始化向量，长度16
     * @return string 加密后的数据（Base64编码）
     */
    public static function encrypt($data, $key, $method = 'AES-256-CBC', $iv = '')
    {
        // 确保密钥长度符合要求
        $key = substr(hash('sha256', $key), 0, 32);

        // 如果没有提供IV，则生成一个
        if (empty($iv)) {
            $ivLength = openssl_cipher_iv_length($method);
            $iv = openssl_random_pseudo_bytes($ivLength);
        }

        // 执行加密
        $encrypted = openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv);

        // 将IV和加密后的数据拼接并进行Base64编码
        return base64_encode($iv . $encrypted);
    }

    /**
     * AES解密
     * @param string $encryptedData 加密数据（Base64编码）
     * @param string $key 加密密钥
     * @param string $method 加密方式，默认为AES-256-CBC
     * @return string 解密后的数据
     */
    public static function decrypt($encryptedData, $key, $method = 'AES-256-CBC')
    {
        // 确保密钥长度符合要求
        $key = substr(hash('sha256', $key), 0, 32);

        // 解码Base64数据
        $encryptedData = base64_decode($encryptedData);

        // 获取IV长度
        $ivLength = openssl_cipher_iv_length($method);

        // 从加密数据中提取IV和密文
        $iv = substr($encryptedData, 0, $ivLength);
        $encrypted = substr($encryptedData, $ivLength);

        // 执行解密
        return openssl_decrypt($encrypted, $method, $key, OPENSSL_RAW_DATA, $iv);
    }
}